/**
 * Created by Administrator on 2016/11/18.
 */
var mongo = require('./db');
//引入markdown插件
var markdown = require('markdown').markdown;
function Post(name, title, tags, post) {
    this.name = name;
    this.title = title;
    //xss跨站脚本攻击的预防
    // this.post = post.replace(/</g, '&lt;').replace(/>/g, '&gt;');
    this.tags = tags;
    this.post = post;
}

//保存文章
Post.prototype.save = function (callback) {
    var date = new Date();
    //保存当前的日期时间格式
    var time = {
        date: date,
        year: date.getFullYear(),
        month: date.getFullYear() + '-' + (date.getMonth() + 1),
        day: date.getFullYear() + '-' +
        (date.getMonth() + 1) + '-' + date.getDate(),
        minute: date.getFullYear() + '-' +
        (date.getMonth() + 1) + '-' + date.getDate() + ' ' +
        date.getHours() + ':' +
        (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()),
        second: date.getFullYear() + '-' +
        (date.getMonth() + 1) + '-' + date.getDate() + ' ' +
        date.getHours() + ':' +
        (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ":" +
        (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())
    };
//    我们要保存的数据
    var post = {
        name: this.name,
        time: time,
        title: this.title,
        tags: this.tags,
        post: this.post,
        //新增的留言字段
        comments: [],
        //新增访问量
        pv: 0
    }
//    接下来就是打开数据库
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err)
            }
            collection.insert(post, {safe: true}, function (err) {
                mongo.close();
                if (err) {
                    return callback(err)
                }
                //如果没有错误的情况下,不给错误提示
                callback(null)
            })
        })
    })
}

Post.get = function (name, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err)
            }
            var query = {};
            if (name) {
                query.name = name;
            }
            //查询
            collection.find(query).sort({
                time: -1
            }).toArray(function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err)
                }
                //在返回结果的时候让markdown执行一下
                //就可以直接使用markdown的语法规则来解析HTML标签了
                docs.forEach(function (doc) {
                    doc.post = markdown.toHTML(doc.post);
                });
                callback(null, docs)//返回查询的文档数据(数组形式)
            })
        })
    })
}
//获取所有的文章
Post.getTen = function (name, page, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            var query = {};
            if (name) {
                query.name = name;
            }
            //查询
            collection.count(query, function (err, total) {
                //total是总页数
                //根据 query 对象查询，并跳过前 (page-1)*10 个结果，返回之后的 10 个结果
                collection.find(query, {
                    //根据当前的页数算出每页的开始位置pageStart
                    skip: (page - 1) * 3,
                    //pageSize理解为步长
                    limit: 3
                }).sort({
                    time: -1
                }).toArray(function (err, docs) {
                    mongo.close();
                    if (err) {
                        return callback(err);
                    }
                    //解析 markdown 为 html
                    docs.forEach(function (doc) {
                        doc.post = markdown.toHTML(doc.post);
                    });
                    callback(null, docs, total);
                });
            });
        });
    });
}
//可以根据用户名、发布时间、文章标题来查询某一篇具体的文章
Post.getOne = function (name, second, title, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            collection.findOne({
                "name": name,
                "time.second": second,
                "title": title
            }, function (err, doc) {
                if (err) {
                    mongo.close();
                    callback(err);
                }
                //增加访问量的代码
                if (doc) {
                    collection.update({
                        "name": name,
                        "time.second": second,
                        "title": title
                    }, {
                        $inc: ({'pv': 1})
                    }, function (err) {
                        mongo.close()
                        if (err) {
                            return callback(err)
                        }
                    })
                }
                //markdown解析一下
                doc.post = markdown.toHTML(doc.post);
                //把留言的内容用markdown解析一下
                doc.comments.forEach(function (comment) {
                    comment.content = markdown.toHTML(comment.content)
                })
                callback(null, doc);
            })
        })
    })
}
//为文章添加编辑功能
Post.edit = function (name, second, title, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongodb.close();
                return callback(err);
            }
            //根据用户名、发表日期及文章名进行查询
            collection.findOne({
                "name": name,
                "time.second": second,
                "title": title
            }, function (err, doc) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, doc);//返回查询文章的原始格式
            });
        });
    });
};
//修改操作
Post.update = function (name, second, title, post, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //更新文章内容
            collection.update({
                "name": name,
                "time.second": second,
                "title": title
            }, {
                $set: {post: post}
            }, function (err) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null);
            });
        });
    });
}
//删除操作
Post.remove = function (name, second, title, callback) {
    //打开数据库
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        //读取 posts 集合
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //根据用户名、日期和标题查找并删除一篇文章
            collection.remove({
                "name": name,
                "time.second": second,
                "title": title
            }, {
                w: 1
            }, function (err) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null);
            });
        });
    });
}
//文章存档
//返回包含用户名,发布的时间,和标题的文章内容
Post.archive = function (callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err)
            }
            collection.find({}, {
                "name": 1,
                "time": 1,
                "title": 1
            }).sort({
                time: -1
            }).toArray(function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, docs);
            });
        });
    });
}

//获取所有的标签
Post.getTags = function (callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //distinct 用来找出给定键的所有不同值
            collection.distinct("tags", function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, docs);
            });
        });
    });
};

//获取标签所对应的文章
Post.getTag = function (tag, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err);
        }
        db.collection('posts', function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err);
            }
            //查询所有 tags 数组内包含 tag 的文档
            //并返回只含有 name、time、title 组成的数组
            collection.find({
                "tags": tag
            }, {
                "name": 1,
                "time": 1,
                "title": 1
            }).sort({
                time: -1
            }).toArray(function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, docs);
            });
        });
    });
};

//通过文章的关键字查询所有的文章信息
Post.search = function (keyword, callback) {
    mongo.open(function (err, db) {
        if (err) {
            return callback(err)
        }
        db.collection('posts',function (err, collection) {
            if (err) {
                mongo.close();
                return callback(err)
            }
            var patten = new RegExp(keyword, 'i')
            collection.find({
                "title": patten
            }, {
                "name": 1,
                "title": 1,
                "time": 1
            }).sort({
                time: -1
            }).toArray(function (err, docs) {
                mongo.close();
                if (err) {
                    return callback(err);
                }
                callback(null, docs);
            })
        })
    })
}
module.exports = Post;